package com.kexio.security.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kexio.security.domain.User;
import com.kexio.security.dto.UserRequest;

/**
 * 用户Mapper接口
 * 
 * @author kexio
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据用户名查询用户
     */
    User selectByUsername(@Param("username") String username);

    /**
     * 根据用户名查询用户（别名方法）
     */
    default User findByUsername(String username) {
        return selectByUsername(username);
    }

    /**
     * 根据邮箱查询用户
     */
    User selectByEmail(@Param("email") String email);

    /**
     * 根据邮箱查询用户（别名方法）
     */
    default User findByEmail(String email) {
        return selectByEmail(email);
    }

    /**
     * 根据手机号查询用户
     */
    User selectByPhone(@Param("phone") String phone);

    /**
     * 根据手机号查询用户（别名方法）
     */
    default User findByPhone(String phone) {
        return selectByPhone(phone);
    }

    /**
     * 统计用户名数量（排除指定ID）
     */
    int countByUsername(@Param("username") String username, @Param("excludeId") Long excludeId);

    /**
     * 统计邮箱数量（排除指定ID）
     */
    int countByEmail(@Param("email") String email, @Param("excludeId") Long excludeId);

    /**
     * 统计手机号数量（排除指定ID）
     */
    int countByPhone(@Param("phone") String phone, @Param("excludeId") Long excludeId);

    /**
     * 分页查询用户
     */
    Page<User> selectUserPage(Page<User> page, @Param("request") UserRequest request);

    /**
     * 根据角色ID查询用户列表
     */
    List<User> selectByRoleId(@Param("roleId") Long roleId);

    /**
     * 根据状态查询用户列表
     */
    List<User> selectByStatus(@Param("status") Integer status);

    /**
     * 根据部门ID查询用户列表
     */
    List<User> selectByDeptId(@Param("deptId") Long deptId);

    /**
     * 更新用户最后登录信息
     */
    int updateLastLoginInfo(@Param("userId") Long userId, 
                           @Param("lastLoginTime") java.time.LocalDateTime lastLoginTime,
                           @Param("lastLoginIp") String lastLoginIp,
                           @Param("loginCount") Integer loginCount);

    /**
     * 批量删除用户
     */
    int deleteByIds(@Param("ids") List<Long> ids);

    /**
     * 根据请求条件统计用户数量
     */
    int countByRequest(@Param("request") UserRequest request);

    /**
     * 批量插入用户
     */
    int insertBatch(@Param("users") List<User> users);

    /**
     * 更新用户状态
     */
    int updateStatus(@Param("userId") Long userId, @Param("status") Integer status);

    /**
     * 重置用户密码
     */
    int resetPassword(@Param("userId") Long userId, @Param("password") String password);

    /**
     * 获取用户统计信息
     */
    int selectTotalCount();

    /**
     * 获取活跃用户数量
     */
    int selectActiveCount();

    /**
     * 获取今日新增用户数量
     */
    int selectTodayCount();
}